package prototype.simple;

/**
 * @author cctv
 */
public class CloneTest {
    public static void main(String[] args){
        ConcretePrototype cp = new ConcretePrototype();
        cp.setAge(12);
        cp.setName("tom");
        cp.list.add("ali");
        try {
            ConcretePrototype copy = (ConcretePrototype) cp.clone();
            copy.setAge(13);
            copy.setName("cctv");
            System.out.println(cp.getAge()+" "+cp.getName());
            System.out.println(copy.getAge()+" "+copy.getName());
            System.out.println(copy==cp);
            copy.list.add("bab");
            // list 是浅拷贝 指向同一个对象的引用 如果需要深拷贝就要自己实现
            System.out.println(copy.list==cp.list);
            System.out.println(cp.list);
            System.out.println(copy.list);
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }

        // 原型模式就是一个现成的对象，这个对象里面有已经设置好的值
        // 当我要新建一个对象，并且要给新建对象赋值，而且赋值内容要跟之前的一样 ORM经常用到
        // 原来的做法
        // ConcretePrototype cp = new ConcretePrototype()
        // cp.setAge(18);

        // ConcretePrototype copy = new ConcretePrototype()
        // copy.setAge(cp.getAge);
        // copy.setName(cp.getName);
        // ……上百个字段 用循环用反射 能实现 但是性能不高
        // 字节码复制getInstance()  不走构造方法

        // 能偶直接拷贝其实际内容的数据类型 只支持9种，8大基本数据类型+string

    }
}
